package net.devkit.common.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import net.devkit.common.toolkit.Pager;

/**
 * 公共的数据访问接口
 * 
 * @param <T>
 * @param <ID>
 */
public interface GenericDao<T extends Serializable, ID extends Serializable> {

	/**
	 * 创建一个实体
	 * 
	 * @param t
	 * @return
	 */
	ID create(final T t);

	/**
	 * 批量创建
	 * 
	 * @param ts
	 */
	void createBatch(final Collection<T> ts);

	/**
	 * 删除一个实体
	 * 
	 * @param t
	 */
	void remove(final T t);

	/**
	 * 根据id删除一个实体
	 * 
	 * @param id
	 */
	void removeById(final ID id);

	/**
	 * 根据jpql删除一个实体
	 * 
	 * @param jpql
	 * @param args
	 */
	Integer removeByJpql(final StringBuilder jpql, final Object... args);

	/**
	 * 批量删除
	 * 
	 * @param ids
	 */
	void removeBatch(final Collection<ID> ids);

	/**
	 * 更新一个实体
	 * 
	 * @param t
	 */
	void modify(final T t);

	/**
	 * 根据jpql更新一个实体
	 * 
	 * @param jpql
	 * @param args
	 */
	Integer modifyByJpql(final StringBuilder jpql, final Object... args);

	/**
	 * 批量更新
	 * 
	 * @param ts
	 */
	void modifyBatch(Collection<T> ts);

	/**
	 * 创建或者更新
	 * 
	 * @param t
	 */
	void createOrModify(final T t);
	
	/**
	 * 批量创建或者更新
	 * @param ts
	 */
	void createOrModifyBatch(Collection<T> ts);

	/**
	 * 根据id加载实体
	 * 
	 * @param id
	 * @return
	 */
	T loadEntityById(final ID id);

	/**
	 * 根据ID查找实体
	 * 
	 * @param id
	 * @return
	 */
	T findEntityById(final ID id);

	/**
	 * 根据jpql查找实体集合
	 * 
	 * @param jpql
	 * @param args
	 * @return
	 */
	List<T> findEntitiesByJpql(final StringBuilder jpql, final Object... args);

	/**
	 * 根据jpql查找唯一的一条记录
	 * 
	 * @param jpql
	 * @param args
	 * @return
	 */
	T findUniqueEntityByJpql(final StringBuilder jpql, final Object... args);

	/**
	 * 分页
	 * 
	 * @param pagesize
	 *            页宽
	 * @param pageno
	 *            　　页码
	 * @param jpql
	 * @param args
	 * @return
	 */
	Pager<T> findPagerByJpql(final Integer pagesize, final Integer pageno,
			final StringBuilder jpql, final Object... args);

	/**
	 * 查找所有
	 * 
	 * @return
	 */
	List<T> findAll();

	/**
	 * 获取总记录数
	 * 
	 * @return
	 */
	Long findCountAll();

	/**
	 * 根据jpql查找记录数
	 * 
	 * @param jpql
	 * @param args
	 * @return
	 */
	Long findCountByJpql(final StringBuilder jpql, final Object... args);

	/**
	 * 调用存储过程
	 * 
	 * @param procName
	 *            存储过程名称
	 * @return
	 */
	List<?> CallProcedure(String procName);

	/**
	 * 强制提交
	 */
	void flush();

	/**
	 * 清空hibernate一级缓存中的对象
	 */
	void clear();
	
	/**
	 * 获取基本的jpql
	 * "from {entityClassName} e " 
	 * @return
	 */
	StringBuilder obtainJpqlOfBasic();

}
